package mysql

import (
	"context"
	"fmt"
	"time"

	"engine/log"
	"gorm.io/gorm/logger"
)

type myLogger struct {
}

func (ts *myLogger) E3LogMarshall() string {
	return "mysql"
}

func (ts *myLogger) LogMode(level logger.LogLevel) logger.Interface {
	return ts
}

func (ts *myLogger) Info(ctx context.Context, s string, args ...any) {
	log.GetLogger().Info(s).Str("args", fmt.Sprintf("%v", args)).Object(ts).Println()
}

func (ts *myLogger) Warn(ctx context.Context, s string, args ...interface{}) {
	log.GetLogger().Warn(s).Str("args", fmt.Sprintf("%v", args)).Object(ts).Println()
}

func (ts *myLogger) Error(ctx context.Context, s string, args ...interface{}) {
	log.GetLogger().Error(s).Str("args", fmt.Sprintf("%v", args)).Object(ts).Println()
}

func (ts *myLogger) Trace(ctx context.Context, begin time.Time, fc func() (sql string, rowsAffected int64), err error) {
	if err != nil {
		elapsed := time.Since(begin)
		sql, rows := fc()
		log.GetLogger().Error(sql, false).Object(ts).Int64("rows", rows).Float64("cost", 2, elapsed.Seconds()).Err(err).Println()
	} else {
		elapsed := time.Since(begin)
		sql, rows := fc()
		log.GetLogger().Trace(sql).Object(ts).Int64("rows", rows).Float64("cost", 2, elapsed.Seconds()).Err(err).Println()
	}
}
